# Боевой Движок

## Устройство движка

Движок представляет собой черный ящик. На вход подаются начальные условия (получаются из файла):
- настройки боевой системы (процент обороны и флота в обломки, скорострел)
- список атакующих и обороняющихся 

На выходе движок генерирует:
- результаты боя (записываются в выходной файл)

## Система боя

by Sanyok.

Система боя ОГейма включается в тех случаях, когда вражеские юниты встречаются у какой-либо планеты или луны.
Это случается в основном при нападении, но и при акции шпионажа, при которой зонд был обнаружен.
В этом случае боевые единицы выстраиваются и начинают палить друг по другу. Это происходит 6 раз (6 раундов).
Кто в конце остался с кораблями, тот победитель. Если в конце на обоих сторонах остались юниты, то бой заканчивается ничьёй и нападающий возвращается домой.
В каждом раунде корабли и защитные сооружения стреляют друг по другу. При этом каждый юнит стреляет один раз (исключение: скорострел) по случайно выбранной цели.
Огневая сила кораблей определяется оценкой атаки. Эта сила поглощается частично или полностью щитами. Если после этого ещё что-то остаётся от бойной силы, то это отнимается от брони корабля.
Выстрелы могут прийтись даже по кораблям с полностью уничтоженной броней. В конце раунда взрываются корабли, у которых больше не осталось брони.
Но и от 30% повреждения брони тоже имеется шанс взрыва, который растёт вместе со степенью повреждения.

### Сила выстрела

Каждый юнит имеет стартовую силу выстрела. Её можно увеличить исследованием оружейной техники на 10% за уровень.
Например: тяжёлый истребитель имеет оценку атаки 150. Оружейная техника уровня 10 подымает это на 100% то есть до 300.
При бое оценки атак всех юнитов прибавляются вместе.

### Щиты

Щиты первыми принимают удар на себя, предохраняя броню от повреждения. Только когда все щиты уничтожены, начинается уничтожение брони.
Щиты могут быть улучшены исследованием щитовой технологии на 10% за уровень исследования.
Щиты полностью восстанавливаются после каждого раунда. Внутри раунда щит уничтожается целыми ячейками по 1%, а остаток силы атаки менее 1% поглощается без каких-либо потерь.
Например, если силы выстрела хватает на 3.7% щита, будет уничтожено лишь 3%, а 0.7% поглотится. Поэтому выстрелы с силой менее 1%, отскакивают от щитов, не уменьшая их силы и не нанося вреда броне.
Вероятность взрыва в этом случае также не высчитывается.
Пример: лёгкий истребитель (атака 50) стреляет по большому куполу (щит 10000). После выстрела у купола всё ещё 10000 щитов, так как выстрел слишком слаб и щит его полностью поглощает.
Тяжёлый же истребитель имеет силу выстрела 150. Это 1.5% от щита, поэтому выстрел засчитывается и со щита снимается целая часть атаки - 1%.
После этого у купола остаётся сила щитов только 9900, так как 0.5% = 50 атаки поглощены щитом без потерь.

### Броня

Броня указывает, какой ущерб корабль может поглотить, прежде чем он будет уничтожен. Баллы брони всегда составляют 10% структуры.
Их можно посчитать уже при постройке юнита. За каждые 10 металла или кристалла (дейт здесь не считается) получается 1 пункт брони.
Сила брони может увеличиваться исследованием брони космических кораблей на 10% за уровень. К сожалению, корабли склонны к взрыванию уже от 30% повреждения брони.
После боя составляется боевой доклад. Единственное исключение: если юниты нападающего были уничтожены в первых 2-х раундах.
Тогда нападающий получает только короткое сообщение. Защитник получает доклад всегда

### Порядок выстрелов

Свой порядок выстрелов точно определён, а именно слева направо в боевом докладе по принципу: лёгкие корабли, тяжёлые корабли, лёгкая защита, тяжёлая защита.

### Выбор цели

Цель выбирается абсолютно случайно. Может быть, что все юниты палят по одной цели, хотя есть и другие цели, но это маловероятно.
Обычно должно быть так, что юниты, которых больше всего, получают больше всех выстрелов. При этом у каждого корабля и защитного сооружения есть вероятность, что в него попадут, равная 1/(кол-во всех юнитов)

### Восстановление защиты

Защитные сооружения имеют вероятность на восстановление после боя в 70%.
При небольшом количестве юнитов (меньше чем 10) эта вероятность высчитывается для каждого сооружения отдельно.
При большем количестве вероятность высчитывается для каждого ТИПА защиты. При этом восстанавливаются всегда 70% +/-10% разрушенной защиты.
При 10 ракетных установках это минимум 6 и максимум 8 восстановленных РУ. Дробные числа нормально округляются. Для каждого типа защиты вероятность высчитывается отдельно.
То есть, например, РУ и лазеры не прибавляются вместе. 

## Скорострел              

Термин Скорострел означает способность некоторых типов кораблей производить за раунд более предписаного системой боёв одного выстрела. 
Вероятность повторного выстрела ограничена и зависит от типов стреляющего корабля и цели выстрела. Данные скорострела указываются в процентуальной вероятности повторного выстрела или - как в игре - среднем колличестве выстрелов за один раунд.
В деталях скорострел работает следующим образом:
Корабль, попадая по юниту, против которого у него есть скорострел, с определённой вероятностью стреляет ещё раз, в соответствии с системой боя - со случайным выбором цели.
При повторном попадании в такую боевую единицу, опять "бросается монета" и если повезёт, происходит ещё один выстрел. 

## Сборка для Linux

Для сборки в Linux используйте следующую команду:

```
gcc battle.c -lm -o battle
```

Разместите полученный исполнямый файл боевого движка в папке http://uni1.yoursever.com/cgi-bin

Путь к боевому движку в настройках вселенной должен быть: ../cgi-bin/battle

## Сборка для Windows

Для сборки боевого движка можно использовать компилятор LCC. Он быстрый и бесплатный:

https://lcc-win32.services.net/
(или ищите "lcc" в Google)

Скопируйте battle.c и battle.h в папку C:/lcc/bin и в командной строке выполните:

```
lc battle.c -o battle.exe
```

(ИСПОЛЬЗУЙТЕ lc ВМЕСТО lcc)

Разместите полученный исполнямый файл боевого движка в папке http://uni1.yoursever.com/game

Путь к боевому движку в настройках вселенной должен быть: battle.exe

## Сборка для FreeBSD

Также как для Linux.
